www.gusucode.com > 基于Visual C++高级界面特效制作百例源码程序 > 基于Visual C++高级界面特效制作百例源码程序/code/char08/ToolbarMenuDemoMDI/SpawnMDIFrameWnd.cpp

    // SpawnMDIFrameWnd.cpp : implementation file
//

#include "stdafx.h"
#include "ToolbarMenuDemoMDI.h"
#include "SpawnMDIFrameWnd.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

// 3D HIGHLIGHT CODE
UINT GfxSetSafeTimer(CWnd * pWnd, const UINT uiElapse)
{
	ASSERT(pWnd && pWnd->GetSafeHwnd());
	UINT iTimer = 1;
	while (iTimer < 10000)
	{
		UINT res = pWnd->SetTimer(1, uiElapse, NULL);
		if (res) return res;
		iTimer ++;
	}
	return 0;
}
// 3D HIGHLIGHT CODE END

/////////////////////////////////////////////////////////////////////////////
// CSpawnMDIFrameWnd

IMPLEMENT_DYNCREATE(CSpawnMDIFrameWnd, CMDIFrameWnd)

CSpawnMDIFrameWnd::CSpawnMDIFrameWnd()
{
// 3D HIGHLIGHT CODE
	oldMenuBarRc.SetRect(0,0,0,0);
	bMenuLooping = false;
	uiTimerId = 0;
// 3D HIGHLIGHT CODE END
}

CSpawnMDIFrameWnd::~CSpawnMDIFrameWnd()
{
}


BEGIN_MESSAGE_MAP(CSpawnMDIFrameWnd, CMDIFrameWnd)
	//{{AFX_MSG_MAP(CSpawnMDIFrameWnd)
	ON_WM_DRAWITEM()
	ON_WM_MEASUREITEM()
	ON_WM_INITMENU()
	ON_WM_INITMENUPOPUP()
	ON_WM_MENUCHAR()
	ON_WM_NCHITTEST()
	ON_WM_TIMER()
	ON_WM_CREATE()
	ON_WM_DESTROY()
	//}}AFX_MSG_MAP
	ON_WM_ENTERMENULOOP()
	ON_WM_EXITMENULOOP()
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSpawnMDIFrameWnd message handlers

void CSpawnMDIFrameWnd::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) 
{
	if (!cSpawn.DrawItem(lpDrawItemStruct))
		CMDIFrameWnd::OnDrawItem(nIDCtl, lpDrawItemStruct);
}

void CSpawnMDIFrameWnd::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct) 
{
	if (!cSpawn.MeasureItem(lpMeasureItemStruct))
		CMDIFrameWnd::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
}

void CSpawnMDIFrameWnd::OnInitMenu(CMenu* pMenu) 
{
	cSpawn.RemapMenu(pMenu);	
	CMDIFrameWnd::OnInitMenu(pMenu);
}

void CSpawnMDIFrameWnd::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu) 
{
	cSpawn.RemapMenu(pPopupMenu);
	CMDIFrameWnd::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);
}

LRESULT CSpawnMDIFrameWnd::OnMenuChar(UINT nChar, UINT nFlags, CMenu* pMenu) 
{
	LRESULT lRes = CMDIFrameWnd::OnMenuChar(nChar, nFlags, pMenu);
	if (nFlags != MF_SYSMENU)
	{
		if (HIWORD(lRes) != 2) cSpawn.FindKeyboardShortcut(nChar, nFlags, pMenu, lRes);
	}
	return lRes;
}

// 3D HIGHLIGHT CODE
UINT CSpawnMDIFrameWnd::OnNcHitTest(CPoint point) 
{
	UINT res = CMDIFrameWnd::OnNcHitTest(point);
	if (!bMenuLooping && res == HTMENU)
	{
		CMenu * pMenu = GetMenu();
		ASSERT(pMenu);

		UINT mifp = MenuItemFromPoint(GetSafeHwnd(), pMenu->GetSafeHmenu(), point);
		if (mifp != (UINT) -1)
		{
			CRect rc, wrc;
			if (GetMenuItemRect(GetSafeHwnd(), pMenu->GetSafeHmenu(), mifp, &rc))
			{
				if (cSpawn.IsSpawnMenu(pMenu, mifp, true))
				{
					GetWindowRect(wrc);
					rc.top -= wrc.top;
					rc.bottom -= wrc.top;
					rc.left -= wrc.left;
					rc.right -= wrc.left;
					if (oldMenuBarRc != rc || oldMenuBarRc.IsRectEmpty())
					{
						CWindowDC dc(this);
						if (!(oldMenuBarRc.IsRectEmpty()))
						{
							dc.Draw3dRect(oldMenuBarRc,cSpawn.crMenu, cSpawn.crMenu);
						}
						dc.Draw3dRect(rc,cSpawn.cr3dHilight, cSpawn.cr3dShadow);
						oldMenuBarRc = rc;
					}
				}
				else
				{
					if (!(oldMenuBarRc.IsRectEmpty()))
					{
						CWindowDC dc(this);
						dc.Draw3dRect(oldMenuBarRc,cSpawn.crMenu, cSpawn.crMenu);
						oldMenuBarRc.SetRect(0,0,0,0);
					}
				}
			}
		}
	}
	else
	{
		if (!(oldMenuBarRc.IsRectEmpty()))
		{
			CWindowDC dc(this);
			dc.Draw3dRect(oldMenuBarRc,cSpawn.crMenu, cSpawn.crMenu);
			oldMenuBarRc.SetRect(0,0,0,0);
		}
	}
	
	return res;
}

void CSpawnMDIFrameWnd::OnTimer(UINT nIDEvent) 
{
	if (uiTimerId == nIDEvent && !bMenuLooping)
	{
		CPoint pt;
		GetCursorPos(&pt);
		LRESULT res = SendMessage(WM_NCHITTEST, 0, MAKELONG(pt.x, pt.y));
	}
	CMDIFrameWnd::OnTimer(nIDEvent);
}

void CSpawnMDIFrameWnd::OnEnterMenuLoop(BOOL bIsTrackPopupMenu)
{
	if (!(oldMenuBarRc.IsRectEmpty()))
	{
		CWindowDC dc(this);
		dc.Draw3dRect(oldMenuBarRc,cSpawn.crMenu, cSpawn.crMenu);
		oldMenuBarRc.SetRect(0,0,0,0);
	}

	bMenuLooping = true;
}

void CSpawnMDIFrameWnd::OnExitMenuLoop(BOOL bIsTrackPopupMenu)
{
	bMenuLooping = false;
}

int CSpawnMDIFrameWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	uiTimerId = GfxSetSafeTimer(this, 100);
	
	return 0;
}

void CSpawnMDIFrameWnd::OnDestroy() 
{
	if (uiTimerId) KillTimer(uiTimerId);
	CMDIFrameWnd::OnDestroy();
}
// 3D HIGHLIGHT CODE END